// cpp_toys.cpp : Defines the entry point for the console application.
//


//构造函数中可以抛出异常，但是析构函数不会被执行，所以已经申请的资源不会被释放
//析构函数中不能抛出异常,实际上如果只有一个析构函数抛出异常，程序不会出现问题。
//如果有一个还未处理的异常，而且在析构的过程中又产生了一个新的异常。那么程序
//的工作就没有定义，或者会退出。原因是同时出现两个异常，程序不知道该如何处理。
//另外异常中通用的一点，产生异常后，从产生异常的位置开始，以后的代码都不会被执行。
#include "ExceptionConstructor.h"

int main()
{
    try
    {
        CExceptionAlpha alpha1(1);
        CExceptionAlpha alpha2(2);
//        CExceptionGroup group1(-1);

//        CExceptionGroup group2(20);
		printf("goes here\n");
    }
    catch(std::invalid_argument &ex)
    {
        printf("Error occur %s\n", ex.what());
    }
    
    return 0;
}

//结构解析
//alpha2 先析构,抛出异常。由于所有的对象的析构函数都需要被执行，所以继续析构alpha1，alpha1析构的时候又抛出异常。程序就懵逼了，不晓得怎么处理。
//输出
/*
CExceptionAlpha construct!
CExceptionAlpha construct!
goes here
2 
1 
terminate called after throwing an instance of 'std::invalid_argument'
  what():  Alpha destruct invalid argument
Aborted (core dumped)
*/
